package com.group.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.annotations.OrderBy;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.group.domain.Media;
import com.group.domain.User;
import com.group.utils.HibernateUtil;

/**
 * 用户数据表的操作
 * 
 * @author
 * @version 1.0
 */
public class UserDao {

	/**
	 * 获取用户总数
	 * 
	 * @return 用户总数
	 */
	public long count() {
		Session session = HibernateUtil.openSession();
		Criteria criteria = session.createCriteria(User.class);
		criteria.add(Restrictions.eq("isDelete", false));
		long count = criteria.list().size();
		session.close();
		return count;
	}

	/**
	 * 分页查询用户列表
	 * 
	 * @param pageNum 页码
	 * @return 指定页码下的用户列表
	 */
	@OrderBy(clause = "id ASC")
	public List<User> findUserListByPage(int pageNo, int pageSize) {
		Session session = HibernateUtil.openSession();
		Criteria criteria = session.createCriteria(User.class);
		// 设置排序条件
		criteria.addOrder(Order.asc("id"));
		// 设置分页信息
		criteria.add(Restrictions.eq("isDelete", false));
		criteria.setFirstResult((pageNo - 1) * pageSize);
		criteria.setMaxResults(pageSize);
		// 获取用户列表
		List<User> userList = criteria.list();
		session.close();
		return userList;
	}

	/**
	 * 获取指定用户名的用户
	 * 
	 * @param username 用户
	 * @return 指定用户名的用户
	 */
	public User findOneByName(String username) {
		Session session = HibernateUtil.openSession();
		Criteria criteria = session.createCriteria(User.class);
		criteria.add(Restrictions.eq("username", username));
		criteria.add(Restrictions.eq("isDelete", false));
		List<User> user = criteria.list();
		session.close();
		return user.isEmpty() ? null : user.get(0);
	}

	/**
	 * 获取指定Like用户名的用户列表
	 * 
	 * @param username 用户
	 * @return Like指定用户名的用户列表
	 */
	public List<User> findUserListByName(String username) {
		Session session = HibernateUtil.openSession();
		Criteria criteria = session.createCriteria(User.class);
		// 设置排序条件
		criteria.addOrder(Order.asc("id"));
		// 获取用户列表
		criteria.add(Restrictions.like("username", "%" + username + "%"));
		criteria.add(Restrictions.eq("isDelete", false));
		List<User> userList = criteria.list();
		session.close();
		return userList;
	}

	/**
	 * 获取指定Like用户名的用户列表
	 * 
	 * @param username 用户名
	 * @return Like指定用户名的用户列表
	 */
	public List<User> findUserLIstByName(String username, int pageNo, int pageSize) {
		Session session = HibernateUtil.openSession();
		Criteria criteria = session.createCriteria(User.class);
		// 设置排序条件
		criteria.addOrder(Order.asc("id"));
		// 获取用户列表
		criteria.add(Restrictions.like("username", "%" + username + "%"));
		criteria.add(Restrictions.eq("isDelete", false));
		// 设置分页信息
		criteria.setFirstResult((pageNo - 1) * pageSize);
		criteria.setMaxResults(pageSize);
		// 获取用户列表
		List<User> userList = criteria.list();
		session.close();
		return userList;
	}

	/**
	 * 检查用户名和密码是否匹配
	 * 
	 * @param username	用户名
	 * @param password	密码
	 * @return						若匹配返回user对象，否则返回空
	 */
	public User checkPassword(String username, String password) {
		Session session = HibernateUtil.openSession();
		Criteria criteria = session.createCriteria(User.class);
		criteria.add(Restrictions.eq("username", username));
		criteria.add(Restrictions.eq("password", password));
		criteria.add(Restrictions.eq("isDelete", false));
		List<User> user = criteria.list();
		session.close();
		return user.isEmpty() ? null : user.get(0);
	}

	/**
	 * 获取指定id的用户
	 * 
	 * @param id id
	 * @return 指定id的用户
	 */
	public User findOneById(int id) {
		Session session = HibernateUtil.openSession();
		User user = null;
		user = (User) session.get(User.class, id);
		return user.getIsDelete() ? null : user;
	}

	/**
	 * 新建用户（注册或管理员新建）
	 * 
	 * @param user 用户对象
	 * @return 是否创建成功
	 */
	public boolean saveUser(User user) {
		Session session = HibernateUtil.openSession();
		Transaction transaction = null;
		int result = 0;
		try {
			transaction = session.beginTransaction();
			result = (Integer) session.save(user);
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		} finally {
			session.close();
		}
		return result > 0;
	}

	/**
	 * 编辑用户信息
	 * 
	 * @param user 新的用户信息（旧的id，新的信息）
	 * @return 是否修改成功
	 */
	public boolean update(User user) {
		Session session = HibernateUtil.openSession();
		Transaction transaction = null;
		try {
			transaction = session.beginTransaction();
			session.update(user);
			transaction.commit();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
			return false;
		} finally {
			session.close();
		}
	}

	/**
	 * 删除用户
	 * 
	 * @param id 要删除用户的id
	 * @return 是否删除成功
	 */
	public boolean delete(int id) {
		Session session = HibernateUtil.openSession();
		Transaction transaction = null;
		try {
			transaction = session.beginTransaction();
			User user = session.get(User.class, id);
			user.setIsDelete(true);
			session.update(user);
			transaction.commit();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
			return false;
		} finally {
			session.close();
		}
	}

}
